package com.binc.testspring.common.config;

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**

 * Description: redisTemplate的序列化器配置

 */
@Configuration
public class RedisTemplateConfig {


        @Bean
        public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){

            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(factory);
            // 使用Jackson2JsonRedisSerialize替换默认序列化方式
            //使用Fastjson2JsonRedisSerializer来序列化和反序列化redis的value值    使用json进行序列化的话，redisTemplate的部分方法就不要用了比如 带有offset的set   append 等
            Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            //启用默认的类型
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            //序列化类，对象映射设置
            jackson2JsonRedisSerializer.setObjectMapper(om);
            redisTemplate.setKeySerializer(stringRedisSerializer);
            // redisTemplate.setValueSerializer(stringRedisSerializer);  //这个value只能是string   存 integer  doubule 都不允许  更不能是一个java bean了；
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // 这个存的就是json对象了，但是从rdm来看的话，纯字符串会多出一个双引号   导致append等方法失效
            // redisTemplate.setValueSerializer(new GenericFastJsonRedisSerializer()); // 这个存的就是json对象了，但是从rdm来看的话，纯字符串会多出一个双引号   导致append等方法失效
            /**
             * stringRedisSerializer   这个value只能是string   存 integer  doubule 都不允许  更不能是一个java bean了；
             *
             * jackson2JsonRedisSerializer    这个村任何值都没有问题了，因为会优先转换成json对象，然后将json串存起来；解析的时候也是这样用json反向解析，回去的就是对象了，   从rdm来看的话，value会多双引号，但是更通用；  问题：导致append等方法失效
             *
             * GenericFastJsonRedisSerializer 是阿里巴巴的fastjson序列化器
             *
             * 综合的话我还是推荐用jackson2JsonRedisSerializer ；更通用，部分方法失效再说吧；
             * 详细对比，看看 《redis序列化对比.png》
             */

            redisTemplate.setHashKeySerializer(stringRedisSerializer);
            redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }

}
